/*************************************************************************
	> File Name: list.h
	> Author: Angel Criss
	> Mail: abbytsing@gmail.com 
	> Created Time: 日  8/10 10:22:21 2014
 ************************************************************************/

#ifndef LIST_H_
#define LIST_H_
#include <stdbool.h>

#define TSIZE 45 /*用于存放片名的数组大小*/
struct film
{
    char title[TSIZE];
    int rating;     /*电影评分 */
};

/*一般类型定义*/

typedef struct film Item;

typedef struct node
{
    Item item;
    struct node *next;
}Node;

typedef Node *List;
/*
 函数原型
 操作： 初始化一个列表
 操作前： plist指向一个列表
 操作后： 该列表被初始化为空列表
 */
void InitailizeList (List *plist);

/*
操作： 确定列表是否为空列表
操作前： plist指向一个已初始化的空列表
操作后：该列表为空怎返回true；否则返回false
*/
bool ListIsEmpty (const List *list);

/*
操作：确定列表是否已满
操作前： plist指向一个已初始化的列表
操作后：如果该列表已满则返回true；否则返回false
*/
bool ListIsFull (const List *plist);

/*
操作： 确定列表中项目的个数
操作前： plist指向一个已初始化的列表
操作后： 返回该列表这中项目的个数
*/
unsigned int ListItemCount (const List *plist);

/*
 操作： 在列表尾部添加一个项目
 操作前： item 是要被增加到列表的项目
         plist是指向一个已初始化的列表
 操作后： 如果可能的话，在列表尾部添加一个新项目 
         函数返回true，否则函数返回false
 */
bool AddItem (Item item,List *plist);

/*
 操作：把一个函数作用于列表的每一个项目
 操作前： plist指向一个已初始化的列表
         pfun指向一个函数，该函数接受一个Item参数并且无返回值
 操作后： pfun指向的函数被作用到列表中的分每一个项目一次
 */
void Traverse (const List *plist, void (*pfun)(Item item));

/*
 操作： 释放以分配的内存（如果有）
 操作前： plist指向一个已初始化的列表
 操作户： 为该列表分配的内存被释放，并且该列表被置为空列表
 */
void EmptyTheList (List *plist);

#endif
